package com.example.myapplication

import android.os.Bundle
import android.text.TextUtils
import androidx.appcompat.app.AppCompatActivity
import com.blankj.utilcode.util.LogUtils
import com.google.gson.Gson
import com.wakeup.sdk.ble.WeikeBleMgr
import com.wakeup.sdk.ble.ext.EventType
import com.wakeup.sdk.ble.ext.OnEventListener
import com.wakeup.sdk.ble.ext.other.MenstrualBean

/**
 * 宗教相关
 */
class MuslimExampleActivity : AppCompatActivity() {
    private val TAG = "MuslimExampleActivity"

    // 赞珠实体
    data class TasbEntity(val year: Int, val month: Int, val day: Int, val count: Int)

    // 设备请求古兰经内容
    data class KoranEntity(
        val sura: Int,
        val paragraphIndex: Int,
        val position: Int,
        val option: Int
    )

    // 设备请求古兰经内容
    data class SceneEntity(
        val sceneId: Int,
        val suraId: Int,
        val paragraphIndex: Int,
        val positionId: Int,
        val option: Int
    )

    private val sceneTitleArr = arrayListOf(
        "All",
        "早上&晚上",
        "祈祷",
        "赞扬 Allah",
        "朝拜 Umrah",
        "旅行",
        "快乐&忧虑",
        "Nature",
        "Good",
        "Home",
        "吃饭&喝水",
        "生病死亡"
    )

    data class PlayEntity(val broadcastFlag: Int, val chapterFlag: Int)

    // 使用方，生理周期 数据
    private val listModel = arrayListOf<MenstrualBean>()

    private val callback = object : OnEventListener {
        override fun onEvent(type: EventType, code: Int, data: Any?) {
            if (type == EventType.TYPE_MUSLIM) {
                when (code) {
                    0 -> { // 请求 克尔白 角度和距离
                        // 模拟数值，具体请获取定位经纬度进行计算与克尔白的 距离与角度
                        WeikeBleMgr.sendKaaba(10, 3777)
                    }
                    1 -> { // 返回 赞珠相关信息
                        if (TextUtils.isEmpty(data as? String)) {
                            LogUtils.i(TAG, "callback data isEmpty ")
                            return
                        }
                        // 更新界面上的赞珠显示
                        val bean = Gson().fromJson(data.toString(), TasbEntity::class.java)
                        LogUtils.i(TAG, "callback bean $bean ")
                    }
                    2 -> { // 请求 古兰经数据
                        if (TextUtils.isEmpty(data as? String)) {
                            LogUtils.i(TAG, "callback koran isEmpty ")
                            return
                        }
                        val koran = Gson().fromJson(data.toString(), KoranEntity::class.java)
                        sendKoranContent(koran)
                    }
                    3 -> { // 请求 祈祷场景
                        val sceneId = data as? Int
                        if (sceneId == null) {
                            LogUtils.i(TAG, "callback sceneId not number ")
                            return
                        }
                        val maxSize = sceneId * 6
                        val last = if (maxSize >= sceneTitleArr.size) {
                            1
                        } else {
                            0
                        }
                        WeikeBleMgr.sendScene(sceneId, last, sceneTitleArr.subList(0, 6))
                    }
                    4 -> { // 请求 祈祷内容
                        if (TextUtils.isEmpty(data as? String)) {
                            LogUtils.i(TAG, "callback scene isEmpty ")
                            return
                        }
                        val scene = Gson().fromJson(data.toString(), SceneEntity::class.java)
                        sendSceneMessage(scene)
                    }
                    5 -> { // 请求 播放
                        if (TextUtils.isEmpty(data as? String)) {
                            LogUtils.i(TAG, "callback playState isEmpty ")
                            return
                        }
                        val playState = Gson().fromJson(data.toString(), PlayEntity::class.java)
                        operatePlay(playState)
                    }
                }
            }
        }

        private fun sendSceneMessage(scene: SceneEntity) {
            LogUtils.i(TAG, "sendSceneMessage scene $scene")
            WeikeBleMgr.sendSceneTitle("场景标题")
            // 发送古兰经内容 ， 章节从第1章第1段，第0包开始，由设备传
            when (scene.option) {
                0 -> { // Int 0x00：获取本段的一帧数据
                    WeikeBleMgr.sendSceneContent(
                        scene.sceneId,
                        scene.suraId,
                        scene.paragraphIndex,
                        scene.positionId,
                        1,
                        0,
                        "场景内容"
                    )
                }
                1 -> { // option 0x01：获取本段上一帧数据
                    /**
                     *  注意：这里只是demo示例，具体需要先判断上一帧是否有数据，
                     *  如果上一帧没有，则要切到上一段的最后一帧，
                     *  如果上一段也没有，则要切换到上一章的最后一段最后一帧数据
                     */
                    WeikeBleMgr.sendSceneContent(
                        scene.sceneId,
                        scene.suraId,
                        scene.paragraphIndex,
                        scene.positionId - 1,
                        1,
                        0,
                        "场景内容"
                    )
                }
                2 -> { // 0x02：获取本段下一帧数据
                    /**
                     *   注意：这里只是demo示例，具体需要先判断下一帧是否有数据，
                     *   如果下一帧没有，则要切到下一段的第一帧，
                     *   如果下一段也没有，则要切换到下一章的第一段第一帧数据
                     */
                    WeikeBleMgr.sendSceneContent(
                        scene.sceneId,
                        scene.suraId,
                        scene.paragraphIndex,
                        scene.positionId + 1,
                        1,
                        0,
                        "场景内容"
                    )
                }
            }
        }

        private fun sendKoranContent(koran: KoranEntity) {
            LogUtils.i(TAG, "sendKoranContent koran $koran")
            // 发送古兰经标题
            WeikeBleMgr.sendKoranTitle("بِسْمِ اللَّهِ الرَّحْمَٰنِ الرَّحِيمِ")

            // 发送古兰经内容 ， 章节从第1章第1段，第0包开始，由设备传
            when (koran.option) {
                0 -> { // Int 0x00：获取本段的一帧数据
                    WeikeBleMgr.sendKoran(
                        koran.sura, koran.paragraphIndex, koran.position, 1, // 设备是否需要修改新的章节名
                        0, // 是否最后一页
                        "بِسْمِ اللَّهِ الرَّحْمَٰنِ الرَّحِيمِ"
                    )
                }
                1 -> { // option 0x01：获取本段上一帧数据
                    /**
                     *  注意：这里只是demo示例，具体需要先判断上一帧是否有数据，
                     *  如果上一帧没有，则要切到上一段的最后一帧，
                     *  如果上一段也没有，则要切换到上一章的最后一段最后一帧数据
                     */
                    WeikeBleMgr.sendKoran(
                        koran.sura, koran.paragraphIndex, koran.position - 1, 1, // 设备是否需要修改新的章节名
                        0, // 是否最后一页
                        "بِسْمِ اللَّهِ الرَّحْمَٰنِ الرَّحِيمِ"
                    )
                }
                2 -> { // 0x02：获取本段下一帧数据
                    /**
                     *   注意：这里只是demo示例，具体需要先判断下一帧是否有数据，
                     *   如果下一帧没有，则要切到下一段的第一帧，
                     *   如果下一段也没有，则要切换到下一章的第一段第一帧数据
                     */
                    WeikeBleMgr.sendKoran(
                        koran.sura, koran.paragraphIndex, koran.position + 1, 1, // 设备是否需要修改新的章节名
                        0, // 是否最后一页
                        "بِسْمِ اللَّهِ الرَّحْمَٰنِ الرَّحِيمِ"
                    )
                }
            }

        }
    }

    private fun operatePlay(playState: PlayEntity) {
        LogUtils.i(TAG, "callback playState $playState")
        when (playState.broadcastFlag) {
            0 -> { //  0：暂停
                /**
                 * 1.先暂停音乐
                 * 2.回复设备暂停的状态
                 */
                WeikeBleMgr.sendKoranPlayState(0)
            }
            1 -> { //  1：开始
                WeikeBleMgr.sendKoranPlayState(1)
            }
            2 -> { //  2：上一章
                WeikeBleMgr.sendKoranPlayState(2)
            }
            3 -> { //  3：下一章
                WeikeBleMgr.sendKoranPlayState(3)
            }
        }
        WeikeBleMgr.sendKoranTitle("回复当前播放的标题")
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_physiology)
        val time = System.currentTimeMillis() / 1000
        for (index in 0..3) {
            val bean = MenstrualBean(index, time, index)
            listModel.add(bean)
        }
        // 增加生理周期的监听回调
        WeikeBleMgr.registerListener(callback, EventType.TYPE_MUSLIM)

        // 下发宗教祈祷时间
        val times = arrayListOf(480, 560, 640, 720, 860)
        // 提醒开关， 默认开
        val enables = arrayListOf(1, 1, 1, 1, 1)
        /**
         * 注意：一般用于设备连接后就下发
         */
        WeikeBleMgr.sendPrayTime(times, enables)
    }

    override fun onDestroy() {
        super.onDestroy()
        WeikeBleMgr.unregisterListener(callback)
    }
}
